package ln.gather.jsr.jndi.repository;

import ln.gather.jsr.jndi.core.Lifecycle;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 组件仓库
 */
public interface ComponentRepository extends Lifecycle {

    /**
     * 根据名称获取实例
     *
     * @param name 实例名称
     */
    <C> C getComponent(String name);

    /**
     * 注册组件实例到实例仓库中
     *
     * @param name      组件名称
     * @param component 组件实例
     */
    void registerComponent(String name, Object component);

    /**
     * 获取仓库中所有的组件名称
     */
    Set<String> getComponentNames();

    /**
     * 将仓库中的组件以Map的形式输出
     */
    default Map<String, Object> getComponents() {
        final Map<String, Object> reMap = new HashMap<>();
        getComponentNames().forEach(x -> reMap.put(x, getComponent(x)));
        return reMap;
    }

}
